package com.collabscm.waf.domain.repository;

import java.util.HashMap;
import java.util.Map;

import javax.persistence.Query;

import com.collabscm.waf.solution.logging.Logger;
import com.collabscm.waf.solution.logging.LoggerFactory;
import com.collabscm.waf.vo.QueryParameters;

/**
 * QueryFiller的选择器，可以根据不同QueryParameters选择最为合适的QueryFiller，进行处理和加工。
 *
 * @author Zeng Raoxing
 */
public class QueryFillerSelector {
	private static Logger logger = LoggerFactory.getLogger(QueryFillerSelector.class);
	/**
	 * 填充器Map
	 */
	private static Map<Class<? extends QueryParameters>, QueryFiller> fillerMap = new HashMap<Class<? extends QueryParameters>, QueryFiller> ();
	
	/**
	 * 填充查询信息，包括：过滤、排序以及分页等。
	 * 
	 * @param query
	 * @param parameters
	 */
	public static void fill(Query query, QueryParameters parameters) {
		QueryFiller qf = findQueryFiller(parameters.getClass());
		if(qf != null) {
			qf.fill(query, parameters);
		}
	}
	
	/**
	 * 填充查询总数的查询条件，注意：此将忽略Order、Start等，仅有过滤条件有效
	 * 
	 * @param query
	 * @param parameters
	 */
	public static void fillCountQuery(Query query, QueryParameters parameters) {
		QueryFiller qf = findQueryFiller(parameters.getClass());
		if(qf != null) {
			qf.fillCountQuery(query, parameters);
		}
	}
	
	private static QueryFiller findQueryFiller(Class<?> clazz) {
		QueryFiller qf = fillerMap.get(clazz);
		if(qf == null) {
			logger.error("未找到{}对应的QueryFiller，无法完成数据填充。", clazz);
		}
		return qf;
	}
	
	/**
	 * QueryFillerSelector的配置类
	 *
	 * @author Zeng Raoxing
	 */
	public static class Configuration {
		
		/**
		 * 添加一个QueryFiller
		 * 
		 * @param clazz
		 * @param filler
		 */
		protected void addFiller(Class<? extends QueryParameters> clazz, QueryFiller filler) {
			fillerMap.put(clazz, filler);
		}
		
	}
	
}
